//
//  WBBaseViewController.swift
//  Weibo
//
//  Created by FF on 16/11/27.
//  Copyright © 2016年 Cold Wind. All rights reserved.
//

import UIKit



// swift 中，利用extension 可以把函数和计算型属性按照功能分类管理，便于阅读和代码维护！
//
// 所有主控制器的基类控制器
class WBBaseViewController: UIViewController {

    // 用户登陆标记
    var userLogon = true
    // 访客视图字典信息
    var visitorDict: [String: String]?
    // 表格视图 - 如果用户没有登录，就不创建
    var tableview: UITableView?
    // 刷新控件
    var refreshController: UIRefreshControl?
    // 上拉刷新标记 true 是上拉
    var isPullup: Bool = false
    
    
    
    // 自定义导航条  UINavigationBar  是个闭包不能用self  ，解决融合问题
    lazy var navigationBar: UINavigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.cz_screenWidth(), height: 64))
    
    // 自定义导航项
    lazy var navItem: UINavigationItem = UINavigationItem()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
        loaddata()
    }

    // 重写 title 的 didset   
    // MARK: - 不明白为啥要重写didSet ， 直接赋值不可以么？
    override var title: String? {
        didSet {
            navItem.title = title
        }
    }
    // 表格数据源，子类实现
    func loaddata() {
        
        // 如果子类不实现任何方法，默认关闭刷新控件
        refreshController?.endRefreshing()
    }
    
}
// MARK: - 访客视图按钮添加监听方法
extension WBBaseViewController {
    @objc fileprivate func login() {
        print("登陆")
    }
    
    @objc fileprivate func register() {
        print("注册")
    }
}

 // MARK: - 设置界面
extension WBBaseViewController {
    
    // FIXME: - 此处有疑问！！setupUI 如果不在extension 里 会导致不执行子类重写的setupUI 方法，很是奇怪！待解决！  已解决！ 原始是 extension 中不能重写父类方法！ 重写父类方法，是子类的职责，扩展是对子类的扩展。
    // 1.线索：当父类的setupUI 在extension 里时，子类的重写的setupUI 也必须在 extension里，不然会导致不执行子类重写的setupUI ，原因不明！
    
    
    // 需要子类去实现，不可以私有！

    fileprivate func setupUI() {
        view.backgroundColor = UIColor.white
        //取消自动缩进 -如果隐藏导航栏，会缩进 20 个点
        automaticallyAdjustsScrollViewInsets = false
        setupNavigationBar()
        userLogon ? setupTableView() : setupVisitorView()
    }
    
    
    /// 设置访客视图
    private func setupVisitorView(){
        let visitorView = WBVisitorView(frame: view.bounds)
       // visitorView.backgroundColor = UIColor.cz_random()
      //  view.addSubview(visitorView)
        view.insertSubview(visitorView, belowSubview: navigationBar)
        // 添加访客视图信息
        visitorView.visitorInfo = visitorDict
        // 添加访客视图按钮监听方法
        visitorView.loginButton.addTarget(self, action: #selector(login), for: .touchUpInside)
        visitorView.rigisterButton.addTarget(self, action: #selector(register), for: .touchUpInside)
        
        // 设置访客视图导航栏按钮
        navItem.leftBarButtonItem = UIBarButtonItem(title: "注册", style: .plain, target: self, action: #selector(register))
        navItem.rightBarButtonItem = UIBarButtonItem(title: "登陆", style: .plain, target: self, action: #selector(login))
    }
    
    
    // 设置表格视图  -- 用户登陆之后执行,子类重写此方法，因为子类不需要关心用户登陆之前的逻辑
     func setupTableView(){
        tableview = UITableView(frame: view.bounds, style: .plain)
       // view.addSubview(tableview!)
        view.insertSubview(tableview!, belowSubview: navigationBar)
        
        
        // 设置表格数据源&代理 -> 目的：子类直接实现数据源方法
        tableview?.dataSource = self
        tableview?.delegate = self
                // 设置tableview 缩进  tabBar 默认高度49 navigationBar 默认高度64
        tableview?.contentInset = UIEdgeInsets(top: navigationBar.bounds.height,
                                               left: 0,
                                               bottom: tabBarController?.tabBar.bounds.height ?? 49,
                                               right: 0)
        
        
        // 设置刷新
        
        // 1. 新建刷新控件
        refreshController = UIRefreshControl()
        
        // 2. 添加刷新控件
        tableview?.addSubview(refreshController!)
        
        // 3. 给刷新控件添加监听
        refreshController?.addTarget(self, action: #selector(loaddata), for: .valueChanged)
        
        
    }
    
    
    // 设置导航条
    private func setupNavigationBar(){
               // 添加导航条
        view.addSubview(navigationBar)
        
        // 将item 设置给bar
        navigationBar.items = [navItem]
        
        // 设置 navBar 整个背景的渲染颜色的渲染颜色
        navigationBar.barTintColor = UIColor.cz_color(withHex: 0xF6F6F6)
        // 设置中间标题字体颜色
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.darkGray]
        // 设置系统导航按钮的文字渲染颜色
        navigationBar.tintColor = UIColor.orange
        
    }

}




extension WBBaseViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }
    /// 基类只准备方法，子类负责具体实现！
    // 子类的数据源方法不需要super
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
     
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        //tableview?.separatorStyle = UITableViewCellSeparatorStyle.none
        
        
        
        // FIXME: 此处逻辑不明白，待解决！
        // 1. 判断 indexpath 是否是最后一行
        // （indexpath.section 最大）/ （indexpath.row 最后一行）
        // 1 -> row
        let row = indexPath.row
        // 2 -> section
       let section = tableView.numberOfSections - 1
      //  let section = indexPath.section
//        let btn = UIButton()
//        btn.backgroundColor = UIColor.orange
//        cell.contentView.addSubview(btn)
        
        if row < 0 || section < 0 {
            return
        }
        // 3 -> 行数
        let count = tableView.numberOfRows(inSection: section)
        
        //print(count)
        // 如果是最后一行，同时没有开始上拉刷新
        if row == (count - 1) && !isPullup {
            print("上拉刷新")
            isPullup = true
            loaddata()
        }
        
//        
//        print("section --- \(section)")
//        print("row --- \(row)")
    }

}

